<?php
declare (strict_types = 1);

namespace app\home\controller;

use AlipayTradeService;
use app\common\model\Cart;
use app\common\model\SpecGoods;
use think\cache\driver\Redis;
use think\db\exception\DbException;
use think\facade\Db;
use think\facade\Log;
use think\facade\View;
use think\Request;
use think\response\Redirect;
use think\Exception;
class Goods extends Category
{

    /**
     * 商品列表
     **/
    public function index()
    {
        try {
            //商品名称
            $goodsName=\request()->get('goods_name');
            $where=[];
            if($goodsName){
                $goodsName=trim($goodsName);
                $where[]=['goods_name','like',"%$goodsName%"];
            }
            //价格区间
            $min_price=\request()->get('min_price');
            $max_price=\request()->get('max_price');
            if($min_price && !$max_price){
                $where[]=['goods_price','>=',$min_price];
            }
            if(!$min_price && $max_price){
                $where[]=['goods_price','<=',$max_price];
            }
            if($min_price && $max_price && $min_price<$max_price){
                $where[]=['goods_price','between',[$min_price,$max_price]];
            }
            //商品分类
            $cate_id=\request()->get('cate_id');
            if($cate_id){
                $cate_id=trim($cate_id);
                if(!is_numeric($cate_id)){
                    return fail('cate_id参数格式错误');
                }
                $where[]=['cate_id','=',$cate_id];
            }
            $data=\app\common\model\Goods::field('cate_name')//一定要加这个field，否则后面关联了也出不来字段
            ->hasWhere('cate',function($query){
                $query->column('cate_name');
            })
                ->where($where)
                ->paginate(3);
            return \view('home',compact('data'));
        }catch (DbException $e){
            return fail($e->getMessage());
        }


    }


    public function detail($id){
        //获取到商品id 进行联查，返回数据
        if(!is_numeric($id)){
            //$this->error('参数格式不对');非常容易踩坑的就是，用jump后，就不能用固定的Category渲染数据了
            return "<script>alert('参数格式不对');window.history.back()</script>";
        }
        \app\home\bussiness\Goods::detail($id);
        return View::fetch();
    }

    public function list(Request $request){
        $cate_id=$request->get('cate_id','','trim');
        if(!is_numeric($cate_id)){
            //$this->error('参数格式不对');非常容易踩坑的就是，用jump后，就不能用固定的Category渲染数据了
            return "<script>alert('参数格式不对');window.history.back()</script>";
        }
       \app\home\bussiness\Goods::list($cate_id);
        return View::fetch();
    }

    public function home(){
        return View::fetch('index');
    }
    /**
     * 商品对应的动态价格
     */
    public function price(){
        $goods_id=request()->post('goods_id');
        $ids=request()->post('ids');
        $price=SpecGoods::where([['goods_id','=',$goods_id],['value_ids','=',$ids]])->value('price');
        return successes('查询成功',$price);

    }
    /**
     * 成功加入购物车
     */
    public function success_cart(){
        $goods_id=\request()->post('goods_id');
        $value_ids=\request()->post('value_ids');
        $number=\request()->post('num');
            //去逻辑处理层，形成订单并返回数据
        \app\home\bussiness\Goods::success_cart($goods_id,$value_ids,$number);
        return View::fetch('success-cart');
    }


    /**
     * 猜你喜欢的加入购物车
     */
    public function hotadd(){
        $goods_id=\request()->get('goods_id');
        //对规格默认第一个
        //数量默认一个
        $spec=SpecGoods::field('value_ids,value_names,price')->where('goods_id',$goods_id)->limit(1)->find()->toArray();
        //加入购物车
        \app\home\bussiness\Goods::success_cart($goods_id,$spec['value_ids'],1);
        //渲染购物车页面
//        $goods=\app\common\model\Goods::find($goods_id)->toArray();
//        $goods['num']=1;
//        $goods['value_names']=$spec['value_names'];
//        $goods['price']=$spec['price'];
//        View::assign('goods',$goods);
        \app\home\bussiness\Goods::cart();
        return \redirect('cart');
    }




    /**
     * 购物车页面
     */
    public function cart(){
        //验证登录
        if(!session('account')){
            return fail('请先登录');
        }
        //查出所有购物车的数据
        \app\home\bussiness\Goods::cart();
        return View::fetch();
    }


    /**
     * 购物车删除
     */
    public function cartDel(){
        $id=\request()->get('id');
        Cart::destroy($id);
        return \redirect('cart');
    }

    /**
     * 修改购物车的选中状态
     * @return \think\response\Json
     */
    public function status(){
        $data=\request()->all();
        \app\home\bussiness\Goods::changeStatus($data);
        return successes('修改成功');

    }

    /**
     * 修改购物车中商品的数量
     */
    public function number(Request $request){
        $data=$request->all();
        \app\home\bussiness\Goods::changeNumber($data);
        //dd($data);
        return successes('修改数量成功');
    }

    /**
     * 获取订单信息
     * @return string
     */
    public function getOrderInfo(){
        //收件人信息
        $uid=\app\home\bussiness\Goods::address();
        //返回商品清单信息
        \app\home\bussiness\Goods::goods();
        //生成订单
        \app\home\bussiness\Goods::order($uid);
        return View::fetch('getOrderInfo');
    }


    /**
     * 订单页面
     */
    public function pay(){


        return View::fetch('pay');
    }




    /**
     * 支付成功
     */
    public function payOk(){
        require_once (public_path()."/pay/config.php");
        require_once public_path().'/pay/pagepay/service/AlipayTradeService.php';


        $arr=$_GET;//验签支付宝返回的信息，使用支付宝公钥。
        $alipaySevice = new AlipayTradeService($config);
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);
            //判断是产生过订单，是的话跳转失败页面

            //支付宝交易号
            $trade_no = htmlspecialchars($_GET['trade_no']);

            //成功后跳转
            return View::fetch('paysuccess');

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
           return  View::fetch('payfail');
        }
    }




    /**
     * 去支付
     */
    public function alipay(Request $request){

        //根据不同的支付id，选择不同的支付方式
        //把订单信息查出来
        echo "        <form name=alipayment action=/pay/pagepay/pagepay.php method=post  id='form'>
            <div id=\"body1\" class=\"show\" name=\"divcontent\">
                <dl class=\"content\">
                    <dt>商户订单号
：</dt>
                    <dd>
                        <input id=\"WIDout_trade_no\" name=\"WIDout_trade_no\"  value='55661325'/>
                    </dd>
                    <hr class=\"one_line\">
                    <dt>订单名称
：</dt>
                    <dd>
                        <input id=\"WIDsubject\" name=\"WIDsubject\" value='aaa'/>
                    </dd>
                    <hr class=\"one_line\">
                    <dt>付款金额
：</dt>
                    <dd>
                        <input id=\"WIDtotal_amount\" name=\"WIDtotal_amount\" value='100' />
                    </dd>
                    <hr class=\"one_line\">
                    <dt>商品描述：</dt>
                    <dd>
                        <input id=\"WIDbody\" name=\"WIDbody\" />
                    </dd>
                    <hr class=\"one_line\">
                    <dt></dt>
                    <dd id=\"btn-dd\">
                        <span class=\"new-btn-login-sp\">
                            <button class=\"new-btn-login\" type=\"submit\" style=\"text-align:center;\">付 款</button>
                        </span>
                        <span class=\"note-help\">如果您点击“付款”按钮，即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
		</form><script>document.getElementById('form').submit()</script>";
    }


    /**
     * 支付宝异步回调
     */
    public function SyncNotify(){//手动请求模拟异步回调
//
//        require_once (public_path()."/pay/config.php");
//        require_once public_path().'/pay/pagepay/service/AlipayTradeService.php';
//
//        $arr=$_POST;
//        $alipaySevice = new AlipayTradeService($config);
//        $alipaySevice->writeLog(var_export($_POST,true));
//        $result = $alipaySevice->check($arr);
        $result=true;
        //记录日志
        Log::write(json_encode(\request()->post()));
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];


//            if($_POST['trade_status'] == 'TRADE_FINISHED') {
//
//                //判断该笔订单是否在商户网站中已经做过处理
//                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
//                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//                //如果有做过处理，不执行商户的业务程序
//
//                //注意：
//                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
//            }
            if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理,

                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            echo "success";	//请不要修改或删除
        }else {
            //验证失败
            echo "fail";

        }
    }

    /**
     * 网络错误捕捉
     * @return \think\response\Json
     */
    public static function connect(){
        //……
        try {
            $connect=connection_status();
            if($connect!=0){
                throw new Exception('网络错误或链接超时');
            }
        }catch (Exception $e){
            return fail($e->getMessage());
        }
    }

}
